
<!DOCTYPE html>
<html lang="zh-cn">

<head>
<meta charset="utf-8" />
<meta name="author" content="TianShangXing" />
<meta name="description" content="Personal blog." />
<meta name="keywords" content="blog, tech" />
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<meta name="generator" content="Hugo 0.68.3" />

<link rel="canonical" href="https://tianshangxing.gitee.io/myblog/">
<meta property="og:title" content="TianShangXing&#39;s Blog" />
<meta property="og:description" content="" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://tianshangxing.gitee.io/myblog/" />
<meta property="og:updated_time" content="2020-04-08T16:08:54+08:00" />

<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="TianShangXing&#39;s Blog"/>
<meta name="twitter:description" content=""/>


<meta itemprop="name" content="TianShangXing&#39;s Blog">
<meta itemprop="description" content="">

<link rel="stylesheet" href="https://tianshangxing.gitee.io/myblog/css/layout.css" />


<link rel="stylesheet" href="https://tianshangxing.gitee.io/myblog/css/default-dark.css" />




<title>


    TianShangXing&#39;s Blog

</title>

</head>


<body>
<div class="main">
<header>

<div class="header-bar">

  <nav>
    <div class="siteTitle">
      <a href="https://tianshangxing.gitee.io/myblog">TianShangXing&#39;s Blog</a>
    </div> 

    
    
    <a class="nav-item" href="https://tianshangxing.gitee.io/myblog/blog/"><div class="nav-item-title">Blogs</div></a>
    
    <a class="nav-item" href="https://tianshangxing.gitee.io/myblog/resume/"><div class="nav-item-title">Resume</div></a>
    

  </nav>

  
<div class="social-links-header">

  
  <a href="mailto:tian_shang_xing@foxmail.com"><div class="social-link">email</div></a>
  

  
  <a href="https://github.com/TianShangXing" target="_blank"><div class="social-link">gh</div></a>
  

  

  

  
  <a href="https://www.linkedin.com/in/%e6%98%9f%e4%bc%b8-%e5%88%98-b7b7321a6" target="_blank"><div class="social-link">in</div></a>
  

</div>


</div>


</header>


<main>


  
    <article class="post-preview">

  <header>
    <h2 class="title"> <a href='https://tianshangxing.gitee.io/myblog/blog/linux/'> Linux</a> </h2>
    <div class="meta">
      <div class="date">
      12 Apr, 2020 - 1 minutes
      </div>
      
<div class="tags">
  
</div>

    </div>

  </header>

  <div class="summary">
    Linux简介  Linux，全称GNU/Linux，是一套免费使用和自由传播的类Unix操作系统，是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展，Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器方面保持着强劲的发展势头以外，在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制，而且可以根据自身的需要来修改完善Linux，使其最大化地适应用户的需要。
Linux 不仅系统性能稳定，而且是开源软件。其核心防火墙组件性能高效、配置简单，保证了系统的安全。在很多企业网络中，为了追求速度和安全，Linux不仅仅是被网络运维人员当作服务器使用，Linux既可以当作服务器，又可以当作网络防火墙是Linux的 一大亮点。
Linux 具有开放源码、没有版权、技术社区用户多等特点 ，开放源码使得用户可以自由裁剪，灵活性高，功能强大，成本低。尤其系统中内嵌网络协议栈 ，经过适当的配置就可实现路由器的功能。这些特点使得Linux成为开发路由交换设备的理想开发平台。
Linux常用命令   系统命令  runlevel # 查看当前的运行级别 systemctl status firewalld # 开启网络服务功能 systemctl stop firewalld # 关闭 systemctl restart firewalld # 重启 systemctl reload firewalld # 重载 reboot # 重启 halt # 关机 poweroff # 关机 查看文件常用指令  cat # 在命令提示符下查看文件内容 more # 在命令提示符中分页查看文件内容 less # 命令行中查看文件可以上下翻页反复浏览 head # 命令行中查看文件头几行 tail # 命令行中查看文件尾几行 wc # 统计文件的单词数 行数等信息 目录管理常用指令  pwd # 查看你当前所在的目录 cd # 切换目录 ls # 查看显示目录的内容 du # 统计目录和文件空间的占用情况 mkdir # 创建新目录 rmdir # 删除空目录 touch # 创建文件 rm # 删除文件 ln # 创建硬链接 ln -s # 创建软链接 cp # 复制文件或目录 mv # 移动文件或目录 which # 查看linux命令所在的目录 账号与权限  1.
  </div>

  <div class="rmore">
    <a href='https://tianshangxing.gitee.io/myblog/blog/linux/' class="rmore">Read more</a>
  </div>


</article>


    <article class="post-preview">

  <header>
    <h2 class="title"> <a href='https://tianshangxing.gitee.io/myblog/blog/django%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98/'> Django跨域问题</a> </h2>
    <div class="meta">
      <div class="date">
      10 Apr, 2020 - 1 minutes
      </div>
      
<div class="tags">
  
</div>

    </div>

  </header>

  <div class="summary">
    关于Django跨域问题 　首先，明确一个问题，就是跨域需要服务端支持才行，而不是靠前端修改代码可以解决的，无论你用jquery axios fetch都是如此。
　这里介绍一下，如果使用的是Django2.0本身作为web服务端，该如何处理跨域请求问题。
 安装插件  pip install django-cors-headers 编辑配置文件  INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'corsheaders', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'corsheaders.middleware.CorsMiddleware', # 这里是新增的中间件 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] CORS_ALLOW_CREDENTIALS = True CORS_ORIGIN_ALLOW_ALL = True 　至此，就可以解决跨域异步请求的问题了，服务端的不同配置也不一样，比如使用nginx服务就需要单独配置nginx才能让服务端支持，所以不能一概而论。
  </div>

  <div class="rmore">
    <a href='https://tianshangxing.gitee.io/myblog/blog/django%E8%B7%A8%E5%9F%9F%E9%97%AE%E9%A2%98/' class="rmore">Read more</a>
  </div>


</article>


    <article class="post-preview">

  <header>
    <h2 class="title"> <a href='https://tianshangxing.gitee.io/myblog/blog/scratch/'> Scratch</a> </h2>
    <div class="meta">
      <div class="date">
      10 Apr, 2020 - 1 minutes
      </div>
      
<div class="tags">
  
</div>

    </div>

  </header>

  <div class="summary">
    Scratch （简易图形化编程工具（语言）） Scratch 是麻省理工媒体实验室“终身幼稚园组”开发的一套电脑程序开发平台，旨在让程序设计语言初学者不需先学习语言语法便能设计产品。
开发者期望通过学习 Scratch ，启发和激励用户在愉快的环境下经由操作（如设计交互故事）去学习程序设计、数学和计算知识，同时获得创造性的思考，逻辑编程，和协同工作的体验。
目前已有1.4版、2.0版本（增加克隆积木，Lego和Makey makey拓展积木）、于2019年1月2日发布3.0正式版，换用 HTML5 编制（增加视频侦测、文字朗读、翻译等选择性下载扩展积木，并增加micro:bit和Lego mindstorms EV3拓展积木）。
Scratch 运行于浏览器。所有人都可以在任意版本中创作自己的程序。
使用 Scratch，你可以编写属于你的互动媒体，像是故事、游戏、动画，然后你可以将你的创意分享给全世界。
Scratch 帮助年轻人更具创造力、逻辑力、协作力。 这些都是生活在 21 世纪不可或缺的基本能力。
Scratch安装 Scratch 的下载是完全免费的。另外他得源码完全开放，允许任意修改，发布，传播（但“SCRATCH”名称和“scratchcat”LOGO受著作权保护）
Scratch 开发平台可安装在Mac OS X、Windows、Linux的平台上。
官网地址： https://scratch.mit.edu/
官方网站和软件是多语言版本，根据操作系统，自动会改成中文界面。
界面与功能 Scratch 开发平台的用户界面分为四部分：程序模件列表，程序设计平台，预览窗口和角色列表。
程序模件列表将其分为8类：动作、外观、声音、画笔、控制、侦测、运算、变量。程序模件各有不同的颜色和形状，以便识别。
Scratch 利用“广播”功能实现事件驱动，协调各个子程序的运行。Scratch 能提前导入图片、音频素材，支持一维数组，以功能封装的方式简化了角色碰撞检测功能。Scratch 不易出现导致程序完全无法运行的严重错误。
主要不足：Scratch 没有针对本地文件的输入/输出功能，不支持多维数组和数组嵌套，自定义子程序不支持设置形式参数也不支持设置返回值，无法进行角色的局部碰撞检测，缺少并发控制，无面向对象特性，不方便进行逻辑条件的复杂组合，调试困难。
  </div>

  <div class="rmore">
    <a href='https://tianshangxing.gitee.io/myblog/blog/scratch/' class="rmore">Read more</a>
  </div>


</article>


    <article class="post-preview">

  <header>
    <h2 class="title"> <a href='https://tianshangxing.gitee.io/myblog/blog/%E9%92%89%E9%92%89%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95/'> 钉钉三方登录</a> </h2>
    <div class="meta">
      <div class="date">
      2 Apr, 2020 - 1 minutes
      </div>
      
<div class="tags">
  
</div>

    </div>

  </header>

  <div class="summary">
    钉钉（DingTalk） 是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台，提供PC版，Web版和手机版，支持手机和电脑间文件互传。
钉钉因中国企业而生，帮助中国企业通过系统化的解决方案（微应用），全方位提升中国企业沟通和协同效率。
这里我们使用Django来集成一下钉钉的三方账号登录，首先登录钉钉开发平台： https://open-dev.dingtalk.com/
在移动应用中选择登录
创建一个网站应用，其中有用的信息是appid,appsecret，还有回调网址
随后，查看官方文档，查看如何构造登录url: https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6
这里我们用django的视图来操作
# 构造钉钉登录url def ding_url(request): appid = 'dingoaukgkwqknzjvamdqh' redirect_uri = 'http://localhost:8000/dingding_back/' return redirect('https://oapi.dingtalk.com/connect/qrconnect?appid=' + appid +'&amp;response_type=code&amp;scope=snsapi_login&amp;state=STATE&amp;redirect_uri=' + redirect_uri) 然后访问: http://localhost:8000/ding_url，就可以进行扫码
随后，钉钉会将code返回到回调网址中，查看官方文档，只有java和php的sdk，并没有python的
怎么办，没关系，自己写，逻辑很简单，将时间戳，秘钥进行hmac加密即可
import time import hmac import base64 from hashlib import sha256 import urllib import json # 构造钉钉回调方法 def ding_back(request): # 获取code code = request.GET.get(&quot;code&quot;) t = time.time() # 时间戳 timestamp = str((int(round(t * 1000)))) appSecret ='ly-AzMKMmCKQP3geaILT_An32kEfKO3HeOtApy5CgKwjytevVZC0WYsT2gxMB160' # 构造签名 signature = base64.
  </div>

  <div class="rmore">
    <a href='https://tianshangxing.gitee.io/myblog/blog/%E9%92%89%E9%92%89%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95/' class="rmore">Read more</a>
  </div>


</article>


    <article class="post-preview">

  <header>
    <h2 class="title"> <a href='https://tianshangxing.gitee.io/myblog/blog/%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95/'> 新浪微博三方登录</a> </h2>
    <div class="meta">
      <div class="date">
      16 Mar, 2020 - 1 minutes
      </div>
      
<div class="tags">
  
</div>

    </div>

  </header>

  <div class="summary">
    新浪微博：中国版的twitter，自2009年8月上线以来，新浪微博就一直保持着爆发式增长。2019年底，微博月活跃用户到达5.16亿，所以使用新浪微博账号进行三方登录来提高用户登录体验就显得尤为重要。本次就来实现一下微博登录。
首先登录微博开放平台： https://open.weibo.com/
选择微链接-&gt;网站接入-&gt;立即接入 新建一个应用
应用创建成功后，会立即跳转审核页面，需要填写一些资质，用来进行审核，其实这些审核没有必要去管，应用压根就不需要通过审核。
只需要拿到appkey和appsecret即可，然后立即点击高级信息，填写回调网址。
需要注意一点，回调授权和取消回调授权地址需要一致。
逻辑流程图： 那么新浪微博的登录逻辑很简单： 拼接url -&gt; 回调获取code -&gt; 利用code换取uid和access_token -&gt; 使用access_token获取用户信息
前端代码 methods:{ // 新浪微博三方登录 sina: function () { // 拼接url let client_id = 1484610767; let url = 'https://api.weibo.com/oauth2/authorize?client_id=' + client_id + '&amp;redirect_uri=http://127.0.0.1:8000/md_admin/weibo'; // 跳转 站外跳转：window.location.href window.location.href = url; }, } 后端代码 # 新浪微博回调方法 def wb_back(request): # 接收参数 code = request.GET.get('code', None) # 定义token接口地址 url = 'https://api.weibo.com/oauth2/access_token' # 定义参数 re = requests.post(url, data={ 'client_id': 1484610767, 'client_secret': 'e61c56200479acd83075a88fb1ab4a87', 'grant_type': 'authorization_code', 'code': code, 'redirect_uri': 'http://127.
  </div>

  <div class="rmore">
    <a href='https://tianshangxing.gitee.io/myblog/blog/%E6%96%B0%E6%B5%AA%E5%BE%AE%E5%8D%9A%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95/' class="rmore">Read more</a>
  </div>


</article>




<div class="page-nav">
  <div class="page-prev">
    
        <a href="https://tianshangxing.gitee.io/myblog/page/2/" title="Previous page" > &lt;&lt; </a>
    
  </div> 

  <div class="page-num">
    3/5
  </div> 

  <div class="page-next">
    
    <a href="https://tianshangxing.gitee.io/myblog/page/4/" title="Next page"> >> </a>
    
  </div> 
</div> 


</main>

  <footer>

  <div class="social-links-footer">

  
  <a href="mailto:tian_shang_xing@foxmail.com"><div class="social-link">Email</div></a>
  

  
  <a href="https://github.com/TianShangXing" target="_blank"><div class="social-link">GitHub</div></a>
  

  

  

  
  <a href="https://www.linkedin.com/in/%e6%98%9f%e4%bc%b8-%e5%88%98-b7b7321a6" target="_blank"><div class="social-link">LinkedIn</div></a>
  

  <div class="social-link">
  <a href="https://tianshangxing.gitee.io/myblog/index.xml" target="_blank">RSS</a>
  </div>

</div>


  <div class="copyright"> Copyright (c) 2020, all rights reserved. </div>

  <div class="poweredby">
    Powered by <a href="https://gohugo.io/">Hugo</a>.
  </div>

  </footer>

</div> 

</body>
</html>

